/*
fmt 包有完整的说明
• 掌握常用的：%s, %d, %v, %+v, %#v
• 不仅仅是 `fmt`的调用，所有格式化字符串的 API 都可以用
• 因为golang字符串拼接只能在 string 之间，所以这个包非常常用
*/

package main

import (
	"fmt"
)

func main() {
	fmt.Print("输出到控制台不换行--- ")
	fmt.Println("输出到控制台并换行")
	fmt.Printf("name=%s,age=%d\n", "Tom", 30)
	fmt.Printf("name=%s,age=%d,height=%v\n", "Tom", 30, fmt.Sprintf("%.2f", 180.567))

	name := "Tom"
	age := 17
	// 这个 API 是返回字符串的，所以大多数时候我们都是用这个
	str := fmt.Sprintf("hello, I am %s, I am %d years old \n", name, age)
	println(str)

	// 这个是直接输出，一般简单程序 DEBUG 会用它输出到一些信息到控制台
	fmt.Printf("hello, I am %s, I am %d years old \n", name, age)

	//go不能直接拼接字符串和数字,但是用这种方式可以
	//fmt.Println("abc"+123) //报错
	fmt.Printf("%s%d", "abc", 123) //abc123 // %s字符串,%d数字
	println()

	replaceHolder()
}

func replaceHolder() {
	u := &user{
		Name: "Tom",
		Age:  17,
	}
	fmt.Printf("v => %v \n", u)
	fmt.Printf("+v => %+v \n", u)
	fmt.Printf("#v => %#v \n", u)
	fmt.Printf("T => %T \n", u)

	/*
		v => &{Tom 17}
		+v => &{Name:Tom Age:17}
		#v => &main.user{Name:"Tom", Age:17}
		T => *main.user
	*/
}

type user struct {
	Name string
	Age  int
}
